﻿/**
 * Classe permettant de faire des requêtes ajax simplifiés
 */
var Request = function(url, type, params)
{
  var _timeout = false;
	/**
	 * L'URL à contacter
	 */
	var _url;
	/**
	 * Les paramètres à envoyer
	 */
	var _params;
	/**
	 * Le type de requête (POST / GET)
	 */
	var _type;
	/**
	 * L'objet XMLHttpRequest associé
	 */
	var _req;
	
	/**
	 * Evènement à la fin du chargement de la requête
	 */
	this.onload = null;
	/**
   * Evènement lors d'une erreur de la requête
   */
	this.onerror = null;

	var _this = this;
	
	
	/**
	 * Récupère la réponse "text" envoyé par le site contacté
	 *
	 * @param {String} La réponse reçue
	 */
	this.getResponseText = function()
	{
		return _req.responseText;
	};
	
	/**
	 * Récupère le status (200, 404, ...) envoyé par le site contacté
	 *
	 * @return {String} Le status reçu
	 */
	this.getStatus = function()
	{
		return _req.status;
	};
	
	/**
	 * Récupère les paramètres envoyés à l'adresse
	 *
	 * @return {String} Les paramètres envoyés
	 */
	this.getParams = function()
	{
		return _params;
	};
	
	/**
	 * Lance la requête à l'adresse indiqué
	 */
	this.start = function()
	{
		var req = new XMLHttpRequest();
		req.open(_type,_url,true);
		req.setRequestHeader("Accept","application/json, text/javascript, */*");
		req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		req.setRequestHeader("X-Requested-With","XMLHttpRequest");
		req.onload = _onload;
		req.onerror = _onerror;
		req.timeout = 10000;
		_req = req;
		
		if (_type == Request.POST) {
			req.send(_getParamsForRequest());
		} else {
			req.send();
		}

    _setTimeout();
	};
  
  this.isTimeout = function()
  {
    return _timeout;
  }
  function _setTimeout()
  {
    setTimeout(_onTimeout,_req.timeout);
  }

  function _onTimeout()
  {
    if (_req.readyState < 3)
    {
      _timeout = true;
      _req.abort();
      _onerror(null);
    }
  }

	/**
	 * Ecouteur déclenché à la fin du chargement de la requête XMLHttpRequest
	 *
	 * @param {Event} L'Event envoyé par XMLHttpRequest
	 */
	function _onload(e)
	{
		// Exécution de la fonction associé à l'évènement onload de l'objet
		if (typeof(_this.onload) == "function")
			_this.onload(e,_this);
	};

	/**
	 * Ecouteur déclenché lors d'une erreur XMLHttpRequest
	 *
	 * @param {Event} L'Event envoyé par XMLHttpRequest
	 */
	function _onerror(e)
	{
		// Exécution de la fonction associé à l'évènement onerror de l'objet
		if (typeof(_this.onerror) == "function")
			_this.onerror(e,_this);
	};

	/**
	 * Renvoie les paramètres formattés pour la requête
	 *
	 * @return {String} la chaîne de caractère comportant les paramètres formattés
	 */
	function _getParamsForRequest()
	{
		var str = "";
		for (var index in _params)
		{
			var typep = typeof(_params[index]);
			
			if (typep == "undefined" || typep == "function") {
				continue;
			}
			// Ajout du séparateur "&"
			if (str != "") str += "&";
			
			// Ajout du paramètre au format name=value
			str += index+"="+_params[index];
		}
		return str;
	};
	
	/**
	 * Constructeur de la classe
	 *
	 * @param {String} url L'URL à contacter
	 * @param {String} type Request.POST ou Request.GET
	 * @param {Object} params Les différents paramètres à envoyés
	 */
	function _construct(url, type, params)
	{
		_url = url;
		_type = type;
		_params = params;
	};
	
	// Appel du constructeur
	_construct(url,type, params);
	
};

Request.POST = "POST";
Request.GET = "GET";